mod dir_mem;
mod raw_data;

pub use dir_mem::DirMemory;
pub use raw_data::MemoryRawData;

/// 理论上内存索引类型应该是和字长有关的，但是我转念一想
/// 64位可以兼容32位，64位虽然不能兼容128位，但是64位机器也不能模拟128位内存啊。。。
/// 即使通过地址映射等方式强行模拟, 也会比较蛋疼，所以先不管
pub trait Memory {
    const BASE: usize;
    fn vaddr_get<T: MemoryRawData>(&self, addr: usize) -> T;
    fn paddr_get<T: MemoryRawData>(&self, addr: usize) -> T;
    fn vaddr_write<T: MemoryRawData>(&mut self, addr: usize, data: T);
    fn paddr_write<T: MemoryRawData>(&mut self, addr: usize, data: T);
    fn len(&self) -> usize;
}
